fn decode(d: &mut D) -> Result<EncodablePackageId, E> {
let string: String = raw_try!(Decodable::decode(d));
let regex = regex!(r"^([^ ]+) ([^ ]+)(?: \(([^\)]+)\))?$");
- let captures = regex.captures(string.as_slice()).expect("invalid serialized PackageId");
+ let captures = regex.captures(string.as_slice())
+ .expect("invalid serialized PackageId");
let name = captures.at(1);
let version = captures.at(2);
}
impl<'a, 'b> GitSource<'a, 'b> {
- pub fn new<'a, 'b>(source_id: &SourceId, config: &'a mut Config<'b>) -> GitSource<'a, 'b> {
+ pub fn new<'a, 'b>(source_id: &SourceId,
+ config: &'a mut Config<'b>) -> GitSource<'a, 'b> {
assert!(source_id.is_git(), "id is not git, id={}", source_id);
let reference = match source_id.kind {
let checkout_path = config.git_checkout_path()
.join(ident.as_slice()).join(reference.as_slice());
+ let reference = match source_id.precise {
+ Some(ref s) => s,
+ None => reference,
+ };
+
GitSource {
remote: remote,
reference: GitReference::for_str(reference.as_slice()),
self.remote.db_at(&self.db_path)
};
- let checkout = try!(repo.copy_to(self.reference.as_slice(), &self.checkout_path));
+ let checkout = try!(repo.copy_to(self.reference.as_slice(),
+ &self.checkout_path));
let source_id = self.source_id.with_precise(checkout.get_rev().to_string());
let path_source = PathSource::new(&self.checkout_path, &source_id);
let checkout = try!(GitCheckout::clone_into(dest, self.clone(),
GitReference::for_str(reference.as_slice())));
- try!(checkout.fetch());
+ if self.remote.has_ref(dest, reference.as_slice()).is_err() {
+ try!(checkout.fetch());
+ }
+ try!(checkout.reset(reference.as_slice()));
try!(checkout.update_submodules());
Ok(checkout)
// In this case we just use `origin` here instead of the database path.
git!(self.location, "fetch", "--force", "--quiet", "origin");
git!(self.location, "fetch", "--force", "--quiet", "--tags", "origin");
- try!(self.reset(self.revision.as_slice()));
Ok(())
}